// 购物车状态
import {
  findCartList,
  insertCart,
  mergeLocalCart,
  deleteCart,
  updateCart,
  checkAllCart
} from '@/api/cart'
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  mutations: {
    addCart (state, good) {
      // 逻辑: 有相同的给goods累加数量
      const addIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addIndex > -1) {
        state.list[addIndex].count += good.count
      } else {
        // 新增
        state.list.unshift(good)
      }
    },
    singelCheck (state, { good, isChecked }) {
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = isChecked
    },
    /**
     * 全选
     * @param {*} state
     * @param {*} isAll
     */
    allCheck (state, isAll) {
      state.list.forEach(item => {
        item.selected = isAll
      })
    },
    /**
     * 删除购物车商品
     * @param {*} state
     * @param {*} good
     */
    delCart (state, good) {
      const delIndex = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(delIndex, 1)
    },
    /**
     * 修改产品数量
     * @param {*} state
     * @param {*} good
     */
    changeCount (state, { good, count }) {
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = count
    },
    // 从服务器获取合并后的购物数据
    setList (state, list) {
      state.list = list
    }
  },
  actions: {
    // 获取服务器合并数据
    async getListAction ({ commit }) {
      const result = await findCartList()
      commit('setList', result)
    },
    // 合并数据
    async mergeCartAction ({ state, dispatch }) {
      if (state.list.length > 0) {
        const mergeData = state.list.map(item => {
          return {
            skuId: item.skuId,
            selected: item.selected,
            count: item.count
          }
        })
        await mergeLocalCart(mergeData)
      }
      dispatch('getListAction')
    },
    // async 返回一个promise对象 外面可以通过.then/await接收return的值
    async addCartAction ({ commit, rootState, dispatch }, good) {
      // rootState 获取其他模块数据
      if (rootState.user.profile.token) {
        // 已登录
        insertCart(good)
        // dispatch('mergeCartAction')
        dispatch('getListAction')
        return '加入成功'
      } else {
        // 未登录
        commit('addCart', good)
        return '加入成功'
      }
    },
    async singelCheckAction (
      { commit, rootState, dispatch },
      { good, isChecked }
    ) {
      // rootState 获取其他模块数据
      if (rootState.user.profile.token) {
        // 已登录
        await updateCart({ ...good, selected: isChecked })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('singelCheck', { good, isChecked })
      }
    },
    // 全选
    async allCheckAction ({ commit, rootState, getters, dispatch }, isAll) {
      // rootState 获取其他模块数据
      if (rootState.user.profile.token) {
        // 已登录
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: isAll, ids })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('allCheck', isAll)
      }
    },
    //
    async delCartAction ({ commit, rootState, dispatch }, good) {
      // rootState 获取其他模块数据
      if (rootState.user.profile.token) {
        // 已登录
        await deleteCart([good.skuId])
        dispatch('getListAction')
      } else {
        // 未登录
        commit('delCart', good)
      }
    },
    async changeCountAction ({ commit, rootState, dispatch }, { good, count }) {
      // rootState 获取其他模块数据
      if (rootState.user.profile.token) {
        // 已登录
        await updateCart({ ...good, count })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('changeCount', { good, count })
      }
    }
  },
  // 1. 有效商品列表=》无效商品（没库存或下架了）
  // 2. 选中的购物车商品数据
  // 3. 选中商品总价
  // 4. 购物车中有效商品是否是全部选中状态
  getters: {
    // 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 已选中列表 selected = true
    validSeled (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 已选择列表总钱数  validSeled 中所有项的单价*数据进行叠加
    validSeledTotal (state, getters) {
      return getters.validSeled.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 全选：有效列表中的seleted字段全为true 才为true
    isAll (state, getters) {
      return getters.validList.every(item => item.selected)
    }
  }
}
